﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Linq;
using WikiDoc.Utils;

namespace WikiDoc.Reader
{
    /// <summary>
    /// <see cref="SectionReader"/>将 XmlDoc 中的 summary, returns 等标签节内的内容转换为多行文本流，
    /// 由于 XmlDoc 中的标签通常是缩进对齐的，因此输出的文本流将截掉这些行的公共前导空白，以尽可能的还原他们
    /// 在代码中所对应的文本状态。
    /// </summary>
    public class SectionReader : TextReader
    {
        /// <summary>
        /// 将输入字符串拆分为单行字符串列表，并提取并截掉公共前导空白
        /// </summary>
        /// <param name="lines">The lines.</param>
        public SectionReader(string lines) 
        {
            using (var reader = new StringReader(lines))
            {
                string line;

                while ((line = reader.ReadLine())!= null)
                {
                    _lines.Add(line.TrimEnd());
                }
            }

            if (_lines.Count == 0)
            {
                IndentCount = 0;
            }
            else if (_lines.Count == 1)
            {
                IndentCount = _lines[0].IndentCount();
            }
            else if(_lines[0].IsBlank())
            {
                IndentCount = _lines.Min(item => item.IsBlank() ? int.MaxValue : item.IndentCount());
            }
            else
            {
                IndentCount = _lines.Skip(1).Min(item => item.IsBlank()? int.MaxValue : item.IndentCount());
            }

            for (int i = 0; i < _lines.Count; i++)
            {
                if (!_lines[i].IsBlank())
                {
                    _lines[i] = _lines[i].Substring(IndentCount);
                }
            }
        }


        /// <summary>
        /// 单行字符串列表，列表中的每一项都对应XmlDoc中的一行，并且已经被截取了公共前导空白
        /// </summary>
        private readonly List<string> _lines = new List<string>();

        /// <summary>
        /// 所有行公共前导空白的个数
        /// </summary>
        public int IndentCount { get; private set; }

        /// <summary>
        /// 下一个要读取的行
        /// </summary>
        private int _index;

        /// <summary>
        /// 从当前流中读取一行字符并将数据作为字符串返回。
        /// </summary>
        /// <returns>输入流的下一行，或者如果已读取了所有字符，则为 null。</returns>
        public override string ReadLine()
        {
            return _index < _lines.Count
                       ? _lines[_index++]
                       : null;
        }

        #region NotSupported

        public override int Peek()
        {
            throw new NotSupportedException();
        }

        public override int Read()
        {
            throw new NotSupportedException();
        }

        public override int Read(char[] buffer, int index, int count)
        {
            throw new NotSupportedException();
        }

        public override int ReadBlock(char[] buffer, int index, int count)
        {
            throw new NotSupportedException();
        }

        public override string ReadToEnd()
        {
            throw new NotSupportedException();
        }

        #endregion
    }
}
